package com.frankie.weibo.miweibo.business.user;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;

import com.frankie.weibo.MiApplication;
import com.frankie.weibo.R;
import com.frankie.weibo.miweibo.base.BaseActivity;
import com.frankie.weibo.miweibo.business.MainActivity;
import com.frankie.weibo.util.AccessTokenKeeper;
import com.frankie.weibo.util.WeiBoConstants;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;

import java.util.Date;

public class LoginActivity extends BaseActivity {

    /** 封装了 "access_token"，"expires_in"，"refresh_token"，并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;
    private AuthInfo mAuthInfo;
    private SsoHandler mSsoHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        if(!getIntent().getBooleanExtra("force", false)){
            verifyLogin();
        }
    }

    /**
     * 验证是否登录
     */
    private void verifyLogin(){
        Oauth2AccessToken accessToken = AccessTokenKeeper.readAccessToken(getApplicationContext());
        if(accessToken.getExpiresTime() != 0){
            //有登录数据，检查是否失效
            Long expires_time = accessToken.getExpiresTime();
            if(new Date(expires_time).after(new Date())){
                //token未失效
                toMain();
                return;
            }
        }
        //token已失效
        init();
    }

    private void init(){

        mAccessToken = AccessTokenKeeper.readAccessToken(this);

        mAuthInfo = new AuthInfo(this, WeiBoConstants.APP_KEY, WeiBoConstants.REDIRECT_URL, WeiBoConstants.SCOPE);
        mSsoHandler = new SsoHandler(this, mAuthInfo);

        mSsoHandler.authorize(new AuthListener());//进入授权页
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
    }

    /**
     * 微博认证授权回调类。
     * 1. SSO 授权时，需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后，
     *    该回调才会被执行。
     * 2. 非 SSO 授权时，当授权结束后，该回调就会被执行。
     * 当授权成功后，请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {

        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            //从这里获取用户输入的 电话号码信息
            String  phoneNum =  mAccessToken.getPhoneNum();
            if (mAccessToken.isSessionValid()) {
                // 显示 Token
                //updateTokenView(false);
                // 保存 Token 到 SharedPreferences
                AccessTokenKeeper.writeAccessToken(mContext, mAccessToken);
                toMain();
            } else {
                // 以下几种情况，您会收到 Code：
                // 1. 当您未在平台上注册的应用程序的包名与签名时；
                // 2. 当您注册的应用程序包名与签名不正确时；
                // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
                String code = values.getString("code");
                String message = "微博认证失败:";//getString(R.string.weibosdk_demo_toast_auth_failed);
                if (!TextUtils.isEmpty(code)) {
                    message = message + "\nObtained the code: " + code;
                }
                Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancel() {
        }

        @Override
        public void onWeiboException(WeiboException e) {
            Toast.makeText(mContext,"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    private void toMain(){
        MiApplication.accessToken = AccessTokenKeeper.readAccessToken(this);
        MiApplication.getInstance().cleanActivity();
        Intent mainIntent = new Intent(this, MainActivity.class);
        startActivity(mainIntent);
    }

}
